﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class ContratoAditivo
    {
        #region Variaveis Membros
        private int _idContratoAditivo;
        private Contrato _contrato;
        private TipoContratoAditivo _tipoAditivo;
        private string _descricao;
        private DateTime _dataInicio;
        private DateTime _dataFim;
        private string _path;
        private string _nomeArquivo;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdContratoAditivo
        {
            get { return _idContratoAditivo; }
            set { _idContratoAditivo = value; }
        }
        public Contrato Contrato
        {
            get { return _contrato; }
            set { _contrato = value; }
        }
        public TipoContratoAditivo TipoAditivo
        {
            get { return _tipoAditivo; }
            set { _tipoAditivo = value; }
        }
        public string Descricao
        {
            get { return _descricao; }
            set { _descricao = value; }
        }
        public DateTime DataInicio
        {
            get { return _dataInicio; }
            set { _dataInicio = value; }
        }
        public DateTime DataFim
        {
            get { return _dataFim; }
            set { _dataFim = value; }
        }
        public string NomeArquivo
        {
            get { return _nomeArquivo; }
            set { _nomeArquivo = value; }
        }
        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }
        #endregion

        #region Construtores
        public ContratoAditivo()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public ContratoAditivo(int idContratoAditivo)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idContratoAditivo);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        private void Carregar(int idContratoAditivo)
        {
            try
            {
                var consulta = from ca in _context.tab_contrato_aditivo
                               where ca.id_aditivo == idContratoAditivo
                               select new
                               {
                                   ca.id_aditivo,
                                   ca.tab_contrato.Id_contrato,
                                   ca.tab_tipo_contrato_aditivo.id_tipo_contrato_aditivo,
                                   ca.descricao,
                                   ca.dt_inicio,
                                   ca.dt_fim,
                                   ca.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this._idContratoAditivo = list.id_aditivo;
                    this._contrato = new Contrato(list.Id_contrato);
                    this._tipoAditivo = new TipoContratoAditivo(list.id_tipo_contrato_aditivo);
                    this._descricao = list.descricao;
                    this._dataInicio = (list.dt_inicio == null) ? DateTime.MinValue : Convert.ToDateTime(list.dt_inicio.ToString());//list.dt_inicio;
                    this._dataFim = (list.dt_fim == null) ? DateTime.MinValue : Convert.ToDateTime(list.dt_fim.ToString());//list.dt_fim;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private int RetornaId(int idContrato, int idTipoContratoAditivo, string descricao, DateTime dataInicio, DateTime dataFim)
        {
            try
            {
                int idContratoAditivo = 0;

                var consulta = from ca in _context.tab_contrato_aditivo
                               where ca.id_aditivo == idContratoAditivo
                               && ca.tab_tipo_contrato_aditivo.id_tipo_contrato_aditivo == idTipoContratoAditivo
                               && ca.descricao == descricao
                               && ca.dt_fim == dataInicio
                               && ca.dt_fim == DataFim
                               orderby ca.id_aditivo
                               select new
                               {
                                   ca.id_aditivo,
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    idContratoAditivo = list.id_aditivo;
                    break;
                }

                return idContratoAditivo;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Publicos

        #region Metodos de Selecao
        public List<ContratoAditivo> SelectAll()
        {
            try
            {
                List<ContratoAditivo> listContratoAditivo = new List<ContratoAditivo>();

                var consulta = from ca in _context.tab_contrato_aditivo
                               select new
                               {
                                   ca.id_aditivo,
                                   ca.tab_contrato.Id_contrato,
                                   ca.tab_tipo_contrato_aditivo.id_tipo_contrato_aditivo,
                                   ca.descricao,
                                   ca.dt_inicio,
                                   ca.dt_fim,
                                   ca.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    ContratoAditivo contratoAditivo = new ContratoAditivo();
                    contratoAditivo.IdContratoAditivo = list.id_aditivo;
                    contratoAditivo.Contrato = new Contrato(list.Id_contrato);
                    contratoAditivo.TipoAditivo = new TipoContratoAditivo(list.id_tipo_contrato_aditivo);
                    contratoAditivo.Descricao = list.descricao;
                    contratoAditivo.DataInicio = (list.dt_inicio == null) ? DateTime.MinValue : Convert.ToDateTime(list.dt_inicio.ToString());//list.dt_inicio;
                    contratoAditivo.DataFim = (list.dt_fim == null) ? DateTime.MinValue : Convert.ToDateTime(list.dt_fim.ToString());//list.dt_fim;
                    contratoAditivo.Path = list.path;

                    listContratoAditivo.Add(contratoAditivo);
                }

                return listContratoAditivo;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<ContratoAditivo> SelectPor(int idContrato)
        {
            try
            {
                List<ContratoAditivo> listContratoAditivo = new List<ContratoAditivo>();

                var consulta = from ca in _context.tab_contrato_aditivo
                               where ca.tab_contrato.Id_contrato == idContrato
                               select new
                               {
                                   ca.id_aditivo,
                                   ca.tab_contrato.Id_contrato,
                                   ca.tab_tipo_contrato_aditivo.id_tipo_contrato_aditivo,
                                   ca.descricao,
                                   ca.dt_inicio,
                                   ca.dt_fim,
                                   ca.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    ContratoAditivo contratoAditivo = new ContratoAditivo();
                    contratoAditivo.IdContratoAditivo = list.id_aditivo;
                    contratoAditivo.Contrato = new Contrato(list.Id_contrato);
                    contratoAditivo.TipoAditivo = new TipoContratoAditivo(list.id_tipo_contrato_aditivo);
                    contratoAditivo.Descricao = list.descricao;
                    contratoAditivo.DataInicio = (list.dt_inicio == null) ? DateTime.MinValue : Convert.ToDateTime(list.dt_inicio.ToString());//list.dt_inicio;
                    contratoAditivo.DataFim = (list.dt_fim == null) ? DateTime.MinValue : Convert.ToDateTime(list.dt_fim.ToString());//list.dt_fim;
                    contratoAditivo.Path = list.path;

                    listContratoAditivo.Add(contratoAditivo);
                }

                return listContratoAditivo;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persistencia
        public void Salvar()
        {
            try
            {
                if (_idContratoAditivo == 0)
                {
                    tab_contrato_aditivo tabContratoAditivo = new tab_contrato_aditivo();
                    tabContratoAditivo.tab_contratoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_contrato", "Id_contrato", _contrato.IdContrato);
                    tabContratoAditivo.tab_tipo_contrato_aditivoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_contrato_aditivo", "id_tipo_contrato_aditivo", _tipoAditivo.IdTipoContratoAditivo);
                    tabContratoAditivo.descricao = _descricao;
                    if (_dataFim != null)
                        tabContratoAditivo.dt_inicio = _dataInicio;
                    tabContratoAditivo.dt_fim = _dataFim;

                    _context.AddTotab_contrato_aditivo(tabContratoAditivo);
                    _context.SaveChanges();

                    _idContratoAditivo = RetornaId(_contrato.IdContrato, _tipoAditivo.IdTipoContratoAditivo, _descricao, _dataInicio, _dataFim);

                    //Grava Path
                    _nomeArquivo = _tipoAditivo.IdTipoContratoAditivo.ToString() + _idContratoAditivo.ToString() + ".pdf";
                    AtualizaPath(_idContratoAditivo, _path + "\\" + _nomeArquivo);
                    
                }
                else
                {
                    tab_contrato_aditivo tabContratoAditivo = (from ca in _context.tab_contrato_aditivo
                                                               where ca.id_aditivo == _idContratoAditivo
                                                               select ca).First();

                    tabContratoAditivo.tab_contratoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_contrato", "Id_contrato", _contrato.IdContrato);
                    tabContratoAditivo.tab_tipo_contrato_aditivoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_contrato_aditivo", "id_tipo_contrato_aditivo", _tipoAditivo.IdTipoContratoAditivo);
                    tabContratoAditivo.descricao = _descricao;
                    tabContratoAditivo.dt_inicio = _dataInicio;
                    tabContratoAditivo.dt_fim = _dataFim;
                    tabContratoAditivo.path = _path;

                    _context.SaveChanges();
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void AtualizaPath(int idContratoAditivo, string path)
        {
            try
            {
                tab_contrato_aditivo tabContratoAditivo = (from ca in _context.tab_contrato_aditivo
                                                           where ca.id_aditivo == idContratoAditivo
                                                           select ca).First();
                tabContratoAditivo.path = path;

                _context.SaveChanges();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
